home *** CD-ROM | disk | FTP | other *** search
/ Freelog 125 / Freelog_MarsAvril2015_No125.iso / Musique / Quod Libet / quodlibet-3.3.0-portable.exe / quodlibet-3.3.0-portable / data / bin / quodlibet / qltk / songlistcolumns.pyc (.txt) < prev    next >
Python Compiled Bytecode  |  2014-12-31  |  14KB  |  341 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.7)
  3.  
  4. import time
  5. import datetime
  6. from gi.repository import Gtk, Pango, GLib
  7. from quodlibet import util
  8. from quodlibet import config
  9. from quodlibet import const
  10. from quodlibet.parse import Pattern
  11. from quodlibet.qltk.views import TreeViewColumnButton
  12. from quodlibet.util.path import fsdecode, unexpand
  13. from quodlibet.formats._audio import FILESYSTEM_TAGS
  14.  
  15. def create_songlist_column(t):
  16.     '''Returns a SongListColumn instance for the given tag'''
  17.     if t in ('~#added', '~#mtime', '~#lastplayed', '~#laststarted'):
  18.         return DateColumn(t)
  19.     if None in ('~length', '~#length'):
  20.         return LengthColumn()
  21.     if None == '~#filesize':
  22.         return FilesizeColumn()
  23.     if None in ('~rating',):
  24.         return RatingColumn()
  25.     if None.startswith('~#'):
  26.         return NumericColumn(t)
  27.     if None in FILESYSTEM_TAGS:
  28.         return FSColumn(t)
  29.     if None.startswith('<'):
  30.         return PatternColumn(t)
  31.     if None not in t and t != 'title':
  32.         return NonSynthTextColumn(t)
  33.     return None(t)
  34.  
  35.  
  36. class SongListColumn(TreeViewColumnButton):
  37.     __last_rendered = None
  38.     
  39.     def __init__(self, tag):
  40.         """tag e.g. 'artist'"""
  41.         title = self._format_title(tag)
  42.         super(SongListColumn, self).__init__(title)
  43.         self.set_tooltip_text(title)
  44.         self.header_name = tag
  45.         self.set_sizing(Gtk.TreeViewColumnSizing.FIXED)
  46.         self.set_visible(True)
  47.         self.set_sort_indicator(False)
  48.  
  49.     
  50.     def _format_title(self, tag):
  51.         '''Format the column title based on the tag'''
  52.         return util.tag(tag)
  53.  
  54.     
  55.     def _needs_update(self, value):
  56.         '''Call to check if the last passed value was the same.
  57.  
  58.         This is used to reduce formating if the input is the same
  59.         either because of redraws or all columns have the same value
  60.         '''
  61.         if self._SongListColumn__last_rendered == value:
  62.             return False
  63.         self._SongListColumn__last_rendered = None
  64.         return True
  65.  
  66.  
  67.  
  68. class TextColumn(SongListColumn):
  69.     '''Base text column'''
  70.     __label = Gtk.Label().create_pango_layout('')
  71.     
  72.     def __init__(self, tag):
  73.         super(TextColumn, self).__init__(tag)
  74.         self._render = Gtk.CellRendererText()
  75.         self.pack_start(self._render, True)
  76.         self.set_cell_data_func(self._render, self._cdf)
  77.         self.set_clickable(True)
  78.  
  79.     
  80.     def _cell_width(self, text, pad = 8):
  81.         '''Returns the column width needed for the passed text'''
  82.         cell_pad = self._render.get_property('xpad')
  83.         return self._text_width(text) + pad + cell_pad
  84.  
  85.     
  86.     def _text_width(self, text):
  87.         self._TextColumn__label.set_text(text, -1)
  88.         return self._TextColumn__label.get_pixel_size()[0]
  89.  
  90.     
  91.     def _cdf(self, column, cell, model, iter_, user_data):
  92.         '''CellRenderer cell_data_func'''
  93.         raise NotImplementedError
  94.  
  95.  
  96.  
  97. class RatingColumn(TextColumn):
  98.     '''Render ~rating directly
  99.  
  100.     (simplifies filtering, saves a function call).
  101.     '''
  102.     
  103.     def __init__(self, *args, **kwargs):
  104.         super(RatingColumn, self).__init__('~rating', *args, **kwargs)
  105.         self.set_expand(False)
  106.         self.set_resizable(False)
  107.         width = self._cell_width(util.format_rating(1))
  108.         self.set_fixed_width(width)
  109.         self.set_min_width(width)
  110.  
  111.     
  112.     def _cdf(self, column, cell, model, iter_, user_data):
  113.         song = model.get_value(iter_)
  114.         rating = song.get('~#rating')
  115.         default = config.RATINGS.default
  116.         if not self._needs_update((rating, default)):
  117.             return None
  118.         None.set_sensitive(rating is not None)
  119.         value = rating if rating is not None else default
  120.         cell.set_property('text', util.format_rating(value))
  121.  
  122.  
  123.  
  124. class WideTextColumn(TextColumn):
  125.     """Resizable and ellipsized at the end. Used for any key with
  126.     a '~' in it, and 'title'.
  127.     """
  128.     
  129.     def __init__(self, *args, **kwargs):
  130.         super(WideTextColumn, self).__init__(*args, **kwargs)
  131.         self._render.set_property('ellipsize', Pango.EllipsizeMode.END)
  132.         self.set_resizable(True)
  133.         self.set_min_width(self._cell_width('000'))
  134.  
  135.     
  136.     def _cdf(self, column, cell, model, iter_, user_data):
  137.         text = model.get_value(iter_).comma(self.header_name)
  138.         if not self._needs_update(text):
  139.             return None
  140.         None.set_property('text', text)
  141.  
  142.  
  143.  
  144. class DateColumn(WideTextColumn):
  145.     """The '~#' keys that are dates."""
  146.     
  147.     def _cdf(self, column, cell, model, iter_, user_data):
  148.         stamp = model.get_value(iter_)(self.header_name)
  149.         if not self._needs_update(stamp):
  150.             return None
  151.         if not None:
  152.             cell.set_property('text', _('Never'))
  153.         else:
  154.             date = datetime.datetime.fromtimestamp(stamp).date()
  155.             today = datetime.datetime.now().date()
  156.             days = (today - date).days
  157.             if days == 0:
  158.                 format_ = '%X'
  159.             elif days < 7:
  160.                 format_ = '%A'
  161.             else:
  162.                 format_ = '%x'
  163.             stamp = time.localtime(stamp)
  164.             text = time.strftime(format_, stamp).decode(const.ENCODING)
  165.             cell.set_property('text', text)
  166.  
  167.  
  168.  
  169. class NonSynthTextColumn(WideTextColumn):
  170.     """Optimize for non-synthesized keys by grabbing them directly.
  171.     Used for any tag without a '~' except 'title'.
  172.     """
  173.     
  174.     def _cdf(self, column, cell, model, iter_, user_data):
  175.         value = model.get_value(iter_).get(self.header_name, '')
  176.         if not self._needs_update(value):
  177.             return None
  178.         None.set_property('text', value.replace('\n', ', '))
  179.  
  180.  
  181.  
  182. class FSColumn(WideTextColumn):
  183.     '''Contains text in the filesystem encoding, so needs to be
  184.     decoded safely (and also more slowly).
  185.     '''
  186.     
  187.     def __init__(self, *args, **kwargs):
  188.         super(FSColumn, self).__init__(*args, **kwargs)
  189.         self._render.set_property('ellipsize', Pango.EllipsizeMode.MIDDLE)
  190.  
  191.     
  192.     def _cdf(self, column, cell, model, iter_, user_data):
  193.         value = model.get_value(iter_).comma(self.header_name)
  194.         if not self._needs_update(value):
  195.             return None
  196.         None.set_property('text', unexpand(fsdecode(value)))
  197.  
  198.  
  199.  
  200. class PatternColumn(WideTextColumn):
  201.     
  202.     def __init__(self, *args, **kwargs):
  203.         super(PatternColumn, self).__init__(*args, **kwargs)
  204.         
  205.         try:
  206.             self._pattern = Pattern(self.header_name)
  207.         except ValueError:
  208.             self._pattern = None
  209.  
  210.  
  211.     
  212.     def _format_title(self, tag):
  213.         return util.pattern(tag)
  214.  
  215.     
  216.     def _cdf(self, column, cell, model, iter_, user_data):
  217.         song = model.get_value(iter_)
  218.         if not self._pattern:
  219.             return None
  220.         value = None._pattern % song
  221.         if not self._needs_update(value):
  222.             return None
  223.         None.set_property('text', value)
  224.  
  225.  
  226.  
  227. class NumericColumn(TextColumn):
  228.     """Any '~#' keys except dates."""
  229.     
  230.     def __init__(self, *args, **kwargs):
  231.         super(NumericColumn, self).__init__(*args, **kwargs)
  232.         self._render.set_property('xalign', 1)
  233.         self.set_alignment(1)
  234.         self._NumericColumn__min_width = self._get_min_width()
  235.         self.set_fixed_width(self._NumericColumn__min_width)
  236.         self.set_expand(False)
  237.         self.set_resizable(False)
  238.         self._single_char_width = self._text_width('0')
  239.         self._texts = { }
  240.         self._timeout = None
  241.  
  242.     
  243.     def _get_min_width(self):
  244.         '''Give the initial and minimum width. override if needed'''
  245.         return self._cell_width('-22.22')
  246.  
  247.     
  248.     def _cdf(self, column, cell, model, iter_, user_data):
  249.         value = model.get_value(iter_).comma(self.header_name)
  250.         if not self._needs_update(value):
  251.             return None
  252.         if None(value, float):
  253.             text = u'%.2f' % round(value, 2)
  254.         else:
  255.             text = unicode(value)
  256.         cell.set_property('text', text)
  257.         self._recalc_width(model.get_path(iter_), text)
  258.  
  259.     
  260.     def _delayed_recalc(self):
  261.         self._timeout = None
  262.         tv = self.get_tree_view()
  263.         if not tv:
  264.             return None
  265.         range_ = None.get_visible_range()
  266.         if not range_:
  267.             return None
  268.         (start, end) = None
  269.         start = start[0]
  270.         end = end[0]
  271.         for key, value in self._texts.items():
  272.             if key <= key:
  273.                 pass
  274.             elif not key <= end + 3:
  275.                 del self._texts[key]
  276.                 continue
  277.             if isinstance(value, basestring):
  278.                 self._texts[key] = self._cell_width(value)
  279.                 continue
  280.         width = self.get_width()
  281.         if not self._texts.values():
  282.             pass
  283.         max_width = max([
  284.             width])
  285.         if width < max_width:
  286.             self.set_fixed_width(max_width)
  287.             self.set_min_width(max_width)
  288.         elif width - max_width >= self._single_char_width and max_width >= self._NumericColumn__min_width:
  289.             self.set_fixed_width(max_width)
  290.             self.set_max_width(max_width)
  291.  
  292.     
  293.     def _recalc_width(self, path, text):
  294.         self._texts[path[0]] = text
  295.         if self._timeout is not None:
  296.             GLib.source_remove(self._timeout)
  297.             self._timeout = None
  298.         self._timeout = GLib.idle_add(self._delayed_recalc, priority = GLib.PRIORITY_LOW)
  299.  
  300.  
  301.  
  302. class LengthColumn(NumericColumn):
  303.     
  304.     def __init__(self):
  305.         super(LengthColumn, self).__init__('~#length')
  306.  
  307.     
  308.     def _get_min_width(self):
  309.         return self._cell_width(util.format_time_display(4942))
  310.  
  311.     
  312.     def _cdf(self, column, cell, model, iter_, user_data):
  313.         value = model.get_value(iter_).get('~#length', 0)
  314.         if not self._needs_update(value):
  315.             return None
  316.         text = None.format_time_display(value)
  317.         cell.set_property('text', text)
  318.         self._recalc_width(model.get_path(iter_), text)
  319.  
  320.  
  321.  
  322. class FilesizeColumn(NumericColumn):
  323.     
  324.     def __init__(self):
  325.         super(FilesizeColumn, self).__init__('~#filesize')
  326.  
  327.     
  328.     def _get_min_width(self):
  329.         return self._cell_width(util.format_size(2.22 * 1048576))
  330.  
  331.     
  332.     def _cdf(self, column, cell, model, iter_, user_data):
  333.         value = model.get_value(iter_).get('~#filesize', 0)
  334.         if not self._needs_update(value):
  335.             return None
  336.         text = None.format_size(value)
  337.         cell.set_property('text', text)
  338.         self._recalc_width(model.get_path(iter_), text)
  339.  
  340.  
  341.